-
Notifications
You must be signed in to change notification settings - Fork 12.3k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[InstCombine] Fold trunc nuw/nsw X to i1 -> true IFF X != 0 #119131
Conversation
@llvm/pr-subscribers-llvm-transforms Author: Andreas Jonson (andjo403) ChangesThis is a fairly common pattern when I tried it on llvm-opt-benchmark over 100 files updated. proof https://alive2.llvm.org/ce/z/prpPex Full diff: https://github.com/llvm/llvm-project/pull/119131.diff 2 Files Affected:
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp b/llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp
index 102b784169ca7d..e15d87289bb97f 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp
@@ -934,6 +934,10 @@ Instruction *InstCombinerImpl::visitTrunc(TruncInst &Trunc) {
}
}
+ if (DestWidth == 1 && Trunc.hasNoUnsignedWrap() &&
+ isKnownNonZero(Src, SQ.getWithInstruction(&Trunc)))
+ return replaceInstUsesWith(Trunc, ConstantInt::getTrue(DestTy));
+
bool Changed = false;
if (!Trunc.hasNoSignedWrap() &&
ComputeMaxSignificantBits(Src, /*Depth=*/0, &Trunc) <= DestWidth) {
diff --git a/llvm/test/Transforms/InstCombine/trunc.ll b/llvm/test/Transforms/InstCombine/trunc.ll
index f29ecb8c313738..22cb66d1916662 100644
--- a/llvm/test/Transforms/InstCombine/trunc.ll
+++ b/llvm/test/Transforms/InstCombine/trunc.ll
@@ -1129,8 +1129,7 @@ define i1 @trunc_nuw_i1_non_zero(i8 %1) {
; CHECK-LABEL: @trunc_nuw_i1_non_zero(
; CHECK-NEXT: [[TMP2:%.*]] = icmp ne i8 [[TMP0:%.*]], 0
; CHECK-NEXT: tail call void @llvm.assume(i1 [[TMP2]])
-; CHECK-NEXT: [[RET:%.*]] = trunc nuw i8 [[TMP0]] to i1
-; CHECK-NEXT: ret i1 [[RET]]
+; CHECK-NEXT: ret i1 true
;
%3 = icmp ne i8 %1, 0
tail call void @llvm.assume(i1 %3)
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This also holds for trunc nsw: https://alive2.llvm.org/ce/z/5oGGAj
ea351b0
to
b118f6d
Compare
good catch fixed now |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM
This is a fairly common pattern when I tried it on llvm-opt-benchmark over 100 files updated.
proof https://alive2.llvm.org/ce/z/prpPex